home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
EnigmA Amiga Run 1997 April
/
EnigmA AMIGA RUN 17 (1997)(G.R. Edizioni)(IT)[!][issue 1997-04][EAR-CD].iso
/
EARCD
/
text
/
hyper
/
Guideance.lha
/
Guideance.e
< prev
next >
Wrap
Text File
|
1996-11-03
|
10KB
|
350 lines
/*
Guideance - display XPK/PP-crunched AmigaGuides
*---------------------------------------------*
Program history:
*--------------*
5.12.94
*-----*
- first version (no optimizations, but does already do work)
8.12.94
*-----*
- used some subroutines instead of one big bunch of E
20.4.95
*-----*
- renamed the proggy from "GoGuide" to "Guideance"
- cleaned up the code a little
- improved PubScreen-handling
1.4.96
*----*
(kein Aprilscherz)
- enhanced PubScreen-handling again. Now Guideance either opens on a
new public screen with the specified name or (if the named public screen
already exists) opens its window on the named public screen
- Some more tiny improvements.
- Fell back to the traditional version scheme.
- Still no error output, dunno if I'll ever do that.
22.10.96
*------*
- added PowerGuide-support (a premiere on the Amiga I think, WOW ;)
- cleaned up here and there
- error handling
- "boosted" executable from 2736 to 4636 bytes :)
- yet to be tested and fixed
23.10.96
*------*
-fixed an old and perhaps deadly bug in the decrunching routine ... oh my.
26.10.96
*------*
- cleaned it up a whole lot - the only wierd and pretty illogical routine left is the tiny
assembly stuff to change the temp-filename if it already is in use
- should be ready for release now, although I still need to write some docs
28.10.96
*------*
- jeez, I still have problems with ReadArgs - fixed
- and some more fixes
30.10.96
*------*
- removed error message for NOFR (could be annoying to users)
- jipee, PowerGuide 1.21 doesn't crash on textfiles anymore - this should make guideance
a must-download ;)
2.11.96
*-----*
- small clean-ups, added simple WB-support
3.11.96
*-----*
- fixed problems with the depth-argument
*/
OPT OSVERSION=39 -> force people to upgrade (needed for SA_LIKEWORKBENCH)
MODULE 'xpk','libraries/xpk','amigaguide','libraries/amigaguide','reqtools','libraries/reqtools','dos/dos',
'intuition/screens','intuition/intuition','graphics/videocontrol','graphics/view','workbench/startup'
ENUM FROM=0,PUBSCREEN,PSW,PSH,DEPTH,POWERGUIDE -> the arguments
ENUM NOERR=42,BADARGS,NORTLIB,NOALLOCFR,NOFR,NOLOCK,NOSCREEN,NOLOCKPS,NOOPEN,NOREAD,NOXPKLIB,XPKIOERR,XPKERR,NOAMIGAGUIDELIB,NOAMIGAGUIDE,NOPOWERGUIDE -> the error messages
DEF myargs[6]:ARRAY OF LONG, -> number of arguments
filename[108]:STRING, -> i.e. STRINGS are NULL-terminated, ARRAYS are not
dir[256]:STRING, -> well, for someone who likes to nest his/her directories ...
wb:PTR TO wbstartup,args:PTR TO wbarg
PROC main() HANDLE
DEF rdargs=NIL,lock=NIL,oldlock,ver,i
ver:='$VER: Guideance 1.0 (3.11.96) by Ralph Debusmann'
myargs:=[NIL,NIL,NIL,NIL,NIL,NIL]
IF (wb:=wbmessage)=NIL
IF (rdargs:=ReadArgs('FROM,PS=PUBSCREEN/K,PSW=PUBSCREENWIDTH/N,PSH=PUBSCREENHEIGHT/N,DEPTH/N,PG=POWERGUIDE/S',myargs,NIL))=NIL THEN Raise(BADARGS)
IF myargs[FROM]=NIL
rtfilereq('Guideance')
IF (lock:=Lock(dir,ACCESS_READ))=NIL THEN Raise(NOLOCK)
oldlock:=CurrentDir(lock)
openag(filename)
CurrentDir(oldlock)
UnLock(lock)
lock:=NIL
ELSE
openag(myargs[FROM])
ENDIF
ELSE
args:=wb.arglist
IF (wb.numargs<=1)
rtfilereq('Guideance')
IF (lock:=Lock(dir,ACCESS_READ))=NIL THEN Raise(NOLOCK)
oldlock:=CurrentDir(lock)
openag(filename)
CurrentDir(oldlock)
UnLock(lock)
lock:=NIL
ELSE
FOR i:=1 TO (wb.numargs-1) -> open multiple files one after the other
oldlock:=CurrentDir(args[i].lock)
openag(args[i].name)
CurrentDir(oldlock)
lock:=NIL
ENDFOR
ENDIF
ENDIF
Raise(NOERR)
EXCEPT
IF rdargs THEN FreeArgs(rdargs)
IF lock THEN UnLock(lock)
SELECT exception
CASE BADARGS
errormsg('Bad arguments.')
CASE NOLOCK
errormsg('Error Lock()ing file.')
ENDSELECT
ENDPROC
/*******************************************************************************/
/*
Output error message
*------------------*
arguments: textformat
*/
PROC errormsg(textformat)
EasyRequestArgs(NIL,[20,0,'Guideance',textformat,'Cancel'],0,0)
ENDPROC
/*******************************************************************************/
/*
Output message
*------------*
arguments: textformat
*/
PROC msg(textformat)
EasyRequestArgs(NIL,[20,0,'Guideance',textformat,'Ok'],0,0)
ENDPROC
/*******************************************************************************/
/*
Reqtools-Filerequester
*--------------------*
arguments: title
used global variables: filename, dir
*/
PROC rtfilereq(title) HANDLE
DEF filereq:PTR TO rtfilerequester
filereq:=NIL
IF (reqtoolsbase:=OpenLibrary('reqtools.library',0))=NIL THEN Raise(NORTLIB)
IF (filereq:=RtAllocRequestA(RT_FILEREQ,NIL))=NIL THEN Raise(NOALLOCFR)
IF (RtFileRequestA(filereq,filename,title,NIL))=FALSE THEN Raise(NOFR) ELSE StrCopy(dir,filereq.dir,ALL)
IF filereq THEN RtFreeRequest(filereq)
IF reqtoolsbase THEN CloseLibrary(reqtoolsbase)
EXCEPT
IF filereq THEN RtFreeRequest(filereq)
IF reqtoolsbase THEN CloseLibrary(reqtoolsbase)
SELECT exception
CASE NORTLIB
errormsg('Error opening reqtools.library')
CASE NOALLOCFR
errormsg('Error allocating filerequester.')
CASE NOFR
-> errormsg('Either error opening filerequester or cancelled req.')
ENDSELECT
ReThrow()
ENDPROC
/*******************************************************************************/
/*
view AmigaGuide-document
*----------------------*
arguments: filename
*/
PROC openag(filename) HANDLE
DEF file,buffer[4]:STRING, -> for checking out the file identity (XPK, PP or unpacked)
xpkoutname[32]:STRING, -> name of temporary unpacked file in T:
aghandle,ret,screen:PTR TO screen,
pubscreen,psw=0,psh=0,depth=0,
command[256]:STRING, -> pretty long for safety reasons, length of SystemTagList-command-argument
xpkioerr=FALSE,xpkout=FALSE,xpkret=FALSE,xpkerrstring[50]:STRING
ret:=FALSE
pubscreen:=myargs[PUBSCREEN]
IF (myargs[PSW]<>NIL) THEN psw:=Long(myargs[PSW])
IF (myargs[PSH]<>NIL) THEN psh:=Long(myargs[PSH])
IF (myargs[DEPTH]<>NIL) THEN depth:=Long(myargs[DEPTH])
-> shitty code follows
IF pubscreen OR depth OR psw OR psh -> PubScreen or depth or width/height given?
IF (depth<0)
msg('Please check your DEPTH-argument.\nDEPTH=2 used.')
depth:=2
ENDIF
IF (depth=0) THEN depth:=2
IF (psw<100) AND (psw<>0)
msg('Please check your PUBLICSCREENWIDTH-argument.\nPUBLICSCREENWIDTH=0 used (-> WB value).')
psw:=0
ENDIF
IF (psh<100) AND (psh<>0)
msg('Please check your PUBLICSCREENHEIGHT-argument.\nPUBLICSCREENHEIGHT=0 used (-> WB value).')
psh:=0
ENDIF
IF (pubscreen=NIL) THEN pubscreen:='Guideance' -> at the moment thus only one screen can be opened at a time if the name of the pubscreen is NOT given
IF (screen:=LockPubScreen(pubscreen))=NIL
IF (psw=0) AND psh
IF (screen:=OpenScreenTagList(NIL,[SA_PUBNAME,pubscreen,SA_LIKEWORKBENCH,TRUE,
SA_HEIGHT,psh,SA_DEPTH,depth,NIL]))=NIL THEN Raise(NOSCREEN)
PubScreenStatus(screen,0) -> make our screen a public one
IF LockPubScreen(pubscreen)=NIL THEN Raise(NOLOCKPS) -> and lock it
ELSEIF psw AND (psh=0)
IF (screen:=OpenScreenTagList(NIL,[SA_PUBNAME,pubscreen,SA_LIKEWORKBENCH,TRUE,
SA_WIDTH,psw,SA_DEPTH,depth,NIL]))=NIL THEN Raise(NOSCREEN)
PubScreenStatus(screen,0)
IF LockPubScreen(pubscreen)=NIL THEN Raise(NOLOCKPS)
ELSEIF psw AND psh
IF (screen:=OpenScreenTagList(NIL,[SA_PUBNAME,pubscreen,SA_LIKEWORKBENCH,TRUE,
SA_WIDTH,psw,SA_HEIGHT,psh,SA_DEPTH,depth,NIL]))=NIL THEN Raise(NOSCREEN)
PubScreenStatus(screen,0)
IF LockPubScreen(pubscreen)=NIL THEN Raise(NOLOCKPS)
ELSE
IF (screen:=OpenScreenTagList(NIL,[SA_PUBNAME,pubscreen,SA_LIKEWORKBENCH,TRUE,
SA_DEPTH,depth,NIL]))=NIL THEN Raise(NOSCREEN)
PubScreenStatus(screen,0)
IF LockPubScreen(pubscreen)=NIL THEN Raise(NOLOCKPS)
ENDIF
ELSE
ScreenToFront(screen) -> throw the screen to the front on which we'd like to open our window
ENDIF
ELSE
screen:=NIL -> no screen opened or opened on
pubscreen:=NIL -> open on default PubScreen (i.e. WB)
ENDIF
IF (file:=Open(filename,MODE_OLDFILE))=NIL THEN Raise(NOOPEN)
IF (Read(file,buffer,4))=-1 THEN Raise(NOREAD)
Close(file)
IF (StrCmp('XPKF',buffer,4)) OR (StrCmp('PP20',buffer,4))
IF (xpkbase:=OpenLibrary('xpkmaster.library',0))=NIL THEN Raise(NOXPKLIB)
xpkoutname:='T:Guideance.temp0'
WHILE ((xpkret:=XpkUnpack([XPK_INNAME,filename,XPK_OUTNAME,xpkoutname,0]))=XPKERR_IOERROUT) AND (xpkioerr=FALSE)
-> just take this wierd and unnecessary piece of assembly as it is ... absolutely unportable ;)
MOVE.L xpkoutname,A0
LEA 16(A0),A0 -> i.e. the number ("0" initially) at the end of "xpkoutname"
ADDQ.B #1,(A0)
CMP.B #$3a,(A0) -> one character after "9" in the ascii-table
BLT.S under10
xpkioerr:=TRUE
under10:
ENDWHILE
IF (xpkioerr=TRUE) THEN Raise(XPKIOERR)
IF (xpkret<0) THEN Throw(XPKERR,xpkret)
xpkout:=TRUE
filename:=xpkoutname
ENDIF
IF (myargs[POWERGUIDE]=NIL)
IF (amigaguidebase:=OpenLibrary('amigaguide.library',0))=NIL THEN Raise(NOAMIGAGUIDELIB)
IF (aghandle:=OpenAmigaGuideA([NIL,filename,NIL,pubscreen,NIL,NIL,NIL,0,NIL,NIL,0,NIL,NIL],0))=NIL THEN Raise(NOAMIGAGUIDE)
CloseAmigaGuide(aghandle)
ELSE
IF pubscreen
StringF(command,'PowerGuide "\s" PUBSCREEN="\s"',filename,pubscreen)
ELSE
StringF(command,'PowerGuide "\s"',filename)
ENDIF
IF (SystemTagList(command,NIL)<>0) THEN Raise(NOPOWERGUIDE)
ENDIF
Raise(NOERR)
EXCEPT
IF screen THEN UnlockPubScreen(NIL,screen)
IF xpkbase THEN CloseLibrary(xpkbase)
IF xpkout THEN DeleteFile(xpkoutname)
IF amigaguidebase THEN CloseLibrary(amigaguidebase)
IF screen AND (screen.firstwindow=NIL) THEN CloseScreen(screen)
SELECT exception
CASE NOSCREEN
errormsg('Error opening PublicScreen.')
CASE NOLOCKPS
errormsg('Error locking PublicScreen.')
CASE NOOPEN
errormsg('Error opening file.')
CASE NOREAD
errormsg('Error reading file.')
CASE NOXPKLIB
errormsg('Error opening xpkmaster.library.')
CASE XPKIOERR
errormsg('Error decrunching file\nOnly 10 crunched Guides may be open simultaneously.')
CASE XPKERR
StringF(xpkerrstring,'Error decrunching file. (XPK-error No. \d)',exceptioninfo)
errormsg(xpkerrstring)
CASE NOAMIGAGUIDELIB
errormsg('Error opening amigaguide.library.')
CASE NOAMIGAGUIDE
errormsg('Error opening AmigaGuide.')
CASE NOPOWERGUIDE
errormsg('Error spawning PowerGuide - it *must* be in your path.')
ENDSELECT
ENDPROC